# 导入单个类
from car import Car

my_new_car = Car('audi', 'a4', 2019)
print(my_new_car.get_descriptive_name())
my_new_car.odometer_reading = 23
my_new_car.read_odometer()


# 在一个模块中存储多个类
from car import ElectricCar
my_tesla = ElectricCar('tesla', 'model s', 2019)

print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
my_tesla.battery.get_range()


# 从一个模块中导入多个类
from car import Car, ElectricCar

my_beetle = Car('volkswagen', 'beetle', 2019)
print(my_beetle.get_descriptive_name())
my_tesla = ElectricCar('tesla', 'roadster', 2019)
print(my_tesla.get_descriptive_name())


# 导入整个模块
# 可以导入整个模块，再使用句点表示法访问需要的类。这种导入
# 方式很简单，代码也易于阅读。因为创建类实例的代码都包含模块
# 名，所以不会与当前文件使用的任何名称发生冲突。
import car  

my_beetle = car.Car('volkswagen', 'beetle', 2019)
print(my_beetle.get_descriptive_name())
my_tesla = car.ElectricCar('tesla', 'roadster', 2019)
print(my_tesla.get_descriptive_name())



# 导入模块中的所有类
# 要导入模块中的每个类，可使用下面的语法：
# from module_name import *
# 不推荐使用这种导入方式，原因有二。第一，如果只看文件开头的
# import 语句，就能清楚地知道程序使用了哪些类，将大有裨益。
# 然而这种导入方式没有明确地指出使用了模块中的哪些类。第二，
# 这种方式还可能引发名称方面的迷惑。如果不小心导入了一个与程
# 序文件中其他东西同名的类，将引发难以诊断的错误。



# 在一个模块中导入另一个模块
# 有时候，需要将类分散到多个模块中，以免模块太大或在同一个模
# 块中存储不相关的类。将类存储在多个模块中时，你可能会发现一
# 个模块中的类依赖于另一个模块中的类。在这种情况下，可在前一
# 个模块中导入必要的类。
from car_class import Car 
from electric_car import ElectricCar

my_beetle = Car('volkswagen', 'beetle', 2019)
print(my_beetle.get_descriptive_name())

my_tesla = ElectricCar('tesla', 'roadster', 2019)
print(my_tesla.get_descriptive_name())



# 使用别名
# 使用模块来组织项目代码时，别名大有裨益。导入类时，也可为其指定别名。
# 要在程序中创建大量电动汽车实例，需要反复输入ElectricCar ，非常烦琐。
# 为避免这种烦恼，可在import 语句中给ElectricCar 指定一个别名：
from electric_car import ElectricCar as EC 
my_tesla= EC('tesla', 'model y', 2020)
print(my_tesla.get_descriptive_name())